/**
 * @description 提供一个Promise，用于等待某个状态就绪，并允许注册就绪后的回调函数。
 * @returns {Object} 返回一个对象，包含onReady函数用于注册就绪回调，以及readyResolve和readyReject用于内部解决或拒绝Promise。
 */
export default function onReadyFn() {
  let readyResolve = null
  let readyReject = null
  const readyPromise = new Promise((resolve, reject) => {
    readyResolve = resolve
    readyReject = reject
  })

  /**
   * 注册一个回调函数，在Promise解决后调用。
   * 如果提供了回调函数，则无论Promise解决还是拒绝，都会调用回调函数。
   * @param {Function} cb - 当Promise解决或拒绝时调用的回调函数。
   * @returns {Promise} promise - 返回一个Promise实例(如果调用的是readyResolve的话就返回fulfilled的状态Promise实例，否则则是rejected的状态的Promise实例)，这个promise始终装载着cb调用的返回值进行返回。
   */
  const onReady = async (cb) => {
    let cbRes = null
    try {
      const res = await readyPromise
      cb && (cbRes = cb(res))
    } catch (err) {
      cb && (cbRes = cb(err))
      throw cbRes
    } finally {
      readyResolve = null
      readyReject = null
    }
    return cbRes
  }

  return {
    onReady,
    readyResolve,
    readyReject
  }
}
